/*
 * Copyright © 2021 http://www.TestCopyright.com/ All rights reserved.
 */
package com.xjh.basestudy.javabase.generic;

import java.util.ArrayList;
import java.util.List;

/**
 * Created with IntelliJ IDEA.
 *
 * @author： XuJianhua
 * @date： 2021/7/24
 * @description：泛型所能解决的问题
 * @modifiedBy：
 * @version: 1.0
 */
/*
//编译时报错：编写程序时报错， 运行时报错：点run时控制台报错

不使用泛型的问题：
要做显式强制类型转换，而这种强制转换编译期是不做检查的，容易把问题留到运行时，
所以 泛型的好处是在编译时检查类型安全，并且所有的强制转换都是自动和隐式的，提高了代码的重用率，避免在运行时出现 ClassCastException。

java 中泛型的引入主要是为了解决两个方面的问题：
1. 增加编译时类型的检查，使用泛型后，编译不出现问题，则运行时就不会出现问题
2. 解决重复代码的编写，能够复用算法。
* */
public class GenericSolveProblem {
    public static void main(String[] args) {
        /*案例一：不使用泛型*/
        List list1 = new ArrayList();
//        我们可以向集合中添加任何类型的数据。当我们在取出数据的时候需要时候类型转换
        list1.add("a");
        list1.add("b");
        list1.add(100);//未加泛型不报错
        System.out.println("输出list1：" + list1);
        for (int i = 0; i < list1.size(); i++) {
//        由此可以看到，没有泛型的时候，减少了编译时的类型检查，
//        在取出元素时需要程序员对每个元素的类型都了解，否则很可能在运行时出现类型转换的异常。
            // 将100转换成string的时候出现类型转换异常ClassCastException
            String name = (String) list1.get(i);
            System.out.println("name:" + name);
        }
        /*案例二：使用泛型*/
//限制集合中元素类型，当添加其他类型元素时直接报错（也就是把元素类型作为参数，当向该集合中添加元素时，只能添加该类型元素）
        ArrayList<String> list2 = new ArrayList<String>();
        list2.add("a");
        list2.add("b");
//不是String类型，编译时就报错
//        list2.add(100);
        for (int i = 0; i < list2.size(); i++) {
            String name = list2.get(i); //不需要再进行强制类型转换
            System.out.println("name:" + name);
        }
    }
}
